本文章同時發佈於:
大家好,繼上次Week23 - 用Minecraft來說明Docker為什麼這麼香 - 概念篇的文章後,接下來要來實作用Docker啟動Minecraft Server。
Docker安裝的部分在Docker的官網都寫得很清楚了,由於本篇主要討論實作而不是安裝,我這邊就把三種系統的安裝介紹都貼上來,不說明此部分了~
Docker內啟動Minecraft Server首先,我們運行:
docker run -p 25565:25565 superj80820/minecraft-server
然後...就沒有然後了,因為Minecraft Server起好了!

你可能會說:等等!我都不用設置些什麼嗎?比如說Minecraft Server的參數,我連的Server的主程式jar都沒下載耶!?

是的,這就是Docker的好處,如上篇所述,Docker可以把需要隔離的的檔案放入裡頭,就像放到資料夾裡,而這資料夾實際上就是一個Docker Image。
Docker又提供了Dockerhub供大家放置Docker Image,我們可以直接下載執行。
所以猜到了嗎?我只是把Minecraft Server這些必備條件打包成Docker Image並上傳至Dockerhub而已:
既然已經起好Minecraft Server了,那本文章就到此結束...喂!才沒有XD
我們接下來好好介紹要怎麼打包Dokcer Image
Dockerfile來打包Docker Image首先可以透過Git來Clone完整範例
再用Terminal進入week24資料夾
$ cd week24
會看到此資料夾有以下幾個檔案

Docker Image
Minecraft Server的參數配置檔Minecraft Server的主程式,可以至官網下載讓我們來看看Dockerfile裡頭是怎麼表示Minecraft Server的運作條件:
# Server執行的環境,我們選用JDK 8
FROM openjdk:8
# Server所需的程式檔與配置,此指令是把week24資料夾所有的檔案都複製到Docker Image裡的/usr/src/myapp資料夾
COPY . /usr/src/myapp
# 說明Minecraft Server在Docker裡運行時的目錄
WORKDIR /usr/src/myapp
# Server執行的方式,我這邊就是把官網的執行指令複製下來而已
CMD ["java", "-Xmx1024M", "-Xms1024M", "-jar", "server.jar", "nogui"]
了解Dockerfile後,我們來打包Docker Image,
.的意思就是指「透過此目錄底下的Dockerfile」來打包-t的意思就是指此Image的名字要取什麼$ docker build . -t=minecraft-server

最後運行打包好的Docker Image,我們需要用-p這個參數把Docker內部的Minecraft Server的25565 port與本機電腦的25565 port做連接,這樣我們才能在Minecraft裡透過localhost:25565連入Docker內部的Minecraft Server
$ docker run -p 25565:25565 minecraft-server

這樣就可以啦~趕快連入Minecraft Server開玩吧!

如果想要把Docker Image放到Dockerhub上,你必須先在Dockerhub上註冊帳號,並在Terminal登入:
$ docker login
輸入完帳號密碼登入完畢後,我們要特別在Docker Image的名子裡裡標示自己的帳號,在Push上Dockerhub:
$ docker build . -t={帳號}/minecraft-server
$ docker push {帳號}/minecraft-server
以我的帳號來說就要這樣下指令:
$ docker build . -t=superj80820/minecraft-server
$ docker push superj80820/minecraft-server
Docker以後的有趣世界在實作了Docker版的Minecraft Server之後,我來整理一下剛剛我們在Docker上獲得的好處。
白話來講就是:
先讓程式可以動,如果有需求在客製化邏輯,如果有需求再優化程式運行速度
就是先求有再求好啦XD,在現在很多很多的Open source之中,我們會很常碰到要「跨語言」的問題。
當語言變換,我們甚至連「讓程式可以動」都變成了一件很難的事,因為我們要去了解這個語言的許多配置與安裝。
比如說小弟我主要是學習Javascript與Golang的,但這時候要架設用Java語言設計的Jenkins CI,以往我就要先安裝Java,並且學習Java架設Server的方式。
但現在我只要下此指令Docker就起好了:
$ docker run jenkins/jenkins
就可以去泡咖啡了吃零食了~
你會發現很多的Open source都會提供Docker,比如go-micor, nginx等。
你可以用很低的成本去轉換不同語言,畢竟「先讓程式可以動,再去了解細節」是更加直觀的。
由於有了Docker將Server的運作條件都打包起來,所以快速啟動Server在電腦上變成了很簡單的事情,
這導致後端從「Server常駐在電腦上」變為「依照不同的流量需求啟動不同數量的Server」
由於有了Docker將Server的隔離變得簡單:
這導致後端從「單一個Server眾多邏輯」變為「多個職責單一的Server分享邏輯」
這次實作了Minecraft Server的Docker Image容器化,下回將會介紹如何透過Docker Compose來管理多個Docker以達到此系列一開始「單個電腦,多個Minecraft Server」的需求~
謝謝你的閱讀,也歡迎分享討論指正~